﻿//// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
//// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)

//using System;
//using System.Collections.Generic;

//namespace Emotive.Otf.OtxEditor.Core
//{
//    internal static class ExtensionMethods
//    {
//        /// <summary>
//        /// Converts a recursive data structure into a flat list.
//        /// </summary>
//        /// <param name="input">The root elements of the recursive data structure.</param>
//        /// <param name="recursion">The function that gets the children of an element.</param>
//        /// <returns>Iterator that enumerates the tree structure in preorder.</returns>
//        public static IEnumerable<T> Flatten<T>(this IEnumerable<T> input, Func<T, IEnumerable<T>> recursion)
//        {
//            Stack<IEnumerator<T>> stack = new Stack<IEnumerator<T>>();
//            try {
//                stack.Push(input.GetEnumerator());
//                while (stack.Count > 0) {
//                    while (stack.Peek().MoveNext()) {
//                        T element = stack.Peek().Current;
//                        yield return element;
//                        IEnumerable<T> children = recursion(element);
//                        if (children != null) {
//                            stack.Push(children.GetEnumerator());
//                        }
//                    }
//                    stack.Pop().Dispose();
//                }
//            } finally {
//                while (stack.Count > 0) {
//                    stack.Pop().Dispose();
//                }
//            }
//        }
//    }
//}
